<!DOCTYPE html>
<html lang="zh-cn">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">




<title>node 命令行程序开发 | Miles`s</title>

<link rel="stylesheet" href="https://mada.gitee.io/notes//css/styles.css">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" 
integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous"></script>


<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/zenburn.min.css" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js" integrity="sha256-/BfiIkHlHoVihZdc6TFuj7MmJ0TWcWsMXkeDFwhi0zw=" crossorigin="anonymous"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script src="https://mada.gitee.io/notes//js/highlight.js"></script>






<div class="container">
    <nav class="navbar level">
      <div class="navbar-brand">
          <a class="nav-item" href="https://mada.gitee.io/notes/"><h1 class="title is-3">Miles`s</h1></a>
      </div>           
      <div class="navbar-menu has-text-centered is-active">
          <div class="navbar-end is-centered">
              
           </div>
      </div>
    </nav>
  </div>
<div class="container">
  <h2 class="subtitle is-6">June 21, 2016</h2>
  <h1 class="subtitle is-size-4-mobile is-size-3-desktop">node 命令行程序开发</h1>
  <div class="content">
    

<p>[TOC]</p>

<h2 id="node-命令行程序开发">node 命令行程序开发</h2>

<h3 id="可执行脚本">可执行脚本</h3>

<p>将执行文件写入 <code>package.json</code></p>

<pre><code>{
	&quot;name&quot;: &quot;hello&quot;,
    &quot;bin&quot;: {
    	&quot;hello&quot;: &quot;hello&quot;
    }
}
</code></pre>

<p>然后执行 <code>npm link</code>命令</p>

<p>然后再执行hello，就不用再单独输入路径。</p>

<h3 id="命令行参数原始写法">命令行参数原始写法</h3>

<pre><code>console.log('hello', process.argv[2])
</code></pre>

<p>process.argv 第一个参数默认是 node
第二个参数是执行路径
第三个开始是用户输入部分。</p>

<h3 id="通过child-process-模块新建子进程-从而执行unix系统命令">通过child_process 模块新建子进程，从而执行unix系统命令</h3>

<pre><code>var name = process.argv[2]
var exec = require('child_process').exec

var child = exec('echo hello', function(err, stdout, stderr){
	if(err) throw err
    console.log(stdout)
})
</code></pre>

<h3 id="shelljs-模块">shelljs 模块</h3>

<p>shelljs 模块包装了 child_process, 使得调用系统进程更加方便。</p>

<pre><code>npm install --save shelljs
</code></pre>

<p>本地模式</p>

<pre><code>var name = process.argv[2]
var shell = require('shelljs')
shell.exec('echo hello')
</code></pre>

<p>全局模式</p>

<pre><code>require('shelljs/global')

cd('lib')
ls('*.js').forEach(function(file){
	console.log(file)
})

cd('..')
</code></pre>

<h3 id="yargs-模块">yargs 模块</h3>

<p>解决如何处理命令行参数的问题</p>

<pre><code>npm install --save yargs
</code></pre>

<p>yargs 提供 argv 对象，用来读取命令行参数。</p>

<pre><code>var argv = require('yargs').argv

console.log('hello', argv.name)
</code></pre>

<pre><code>$ hello --name=tom
hello tom
</code></pre>

<p>可以使用<code>alias</code>方法，指定name是n的别名</p>

<pre><code>var argv = require('yargs')
	.alias('n', 'name')
    .argv
console.log('hello', argv.n)
</code></pre>

<p>这样短参数和长参数就都可以使用了。</p>

<pre><code>$hello -n tom
$hello --name tom
</code></pre>

<p><code>argv</code>对象有一个下划线（_）属性，可以获取非连接词线开头的参数</p>

<pre><code>var argv = require('yargs').argv

console.log('hello', argv.n)
console.log(argv._)
</code></pre>

<p>用法</p>

<pre><code>$ hello A -n tom B C
hello tom
['A', 'B', 'C']
</code></pre>

<h3 id="命令行参数的配置">命令行参数的配置</h3>

<pre><code>demand： 是否必选
default： 默认值
describe： 提示
</code></pre>

<pre><code>var argv = require('yargs')
	.demand(['n'])
    .default({n: 'tom'})
    .describe({n: 'your name'})
    .argv

console.log('hello', argv.n)
</code></pre>

<p>指定n不可忽略，默认值为tom，并给出一行提示。</p>

<p>options 方法允许将所有这些配置写进一个对象。</p>

<pre><code>var argv = require('yargs')
	.option('n', {
    	alias: 'name',
        demand: true,
        default: 'tom',
        describe: 'your name',
        type: 'string'
    })
    .argv
console.log('hello ', argv.n)
</code></pre>

<p>boolean 方法</p>

<pre><code>var argv = require('yargs')
	.boolean('[n]')
    .argv
console.log('hello ', argv.n)
</code></pre>

<h3 id="帮助信息">帮助信息</h3>

<p>1.usage: 用法格式
2.example： 提供例子
3.help： 显示帮助信息
4.epilog： 出现在帮助信息的结尾</p>

<pre><code>var argv = require('yargs')
	.option('f', {
    	alias: 'name',
        demand: true,
        default: 'tom',
        describe: 'your name',
        type: 'string'
    })
    .usage('Usage: hello [options]')
    .example('hello -n tom', 'say hello to Tom')
    .help('h')
    .alias('n', 'help')
    .epilog('copyright 2015')
    .argv

console.log('hello', argv.n)
</code></pre>

  </div>
</div>
<div class="container has-text-centered">
    
</div>

<div class="container has-text-centered">
  
</div>
<section class="section">
  <div class="container has-text-centered">
    <p></p>
  </div>
</section>


